package service

import (
	appsv1 "k8s.io/api/apps/v1"
	corev1 "k8s.io/api/core/v1"
	"sort"
	"time"
	"strings"
)

// （1）分页

type FilterQuery struct {
	Name string
}

type PaginateQuary struct {
	Limit int //单页数据的条数
	Page int   //第几页
}

//定义过滤和分页属性  过滤Name  分页Limit和Page
type DataSelectQuery struct {
	FilterQuery *FilterQuery
	PaginateQuary *PaginateQuary
}

//DataCell接口 用于各种资源list的类型转换，转换后可以使用dataselector的自定义排序方法
type DataCell interface {
	GetCreation() time.Time
	GetName()  string
}

//dataSelect用于封装排序、过滤、分页的数据类型
type dataSelector struct {
	GenericDataList []DataCell
	DataSelectQuery *DataSelectQuery
}


// （2） 排序
//   https://segmentfault.com/a/1190000008062661   golang 对自定义类型排序
//实现自定义结构的排序  需要重写Len Swap Less方法

func (d *dataSelector) Len() int {
	return len(d.GenericDataList)
}
//Swap方法用于在数组中的元素在比较大小后的位置交换，可定义升序或降序
func (d *dataSelector) Swap(i ,j int)  {
	d.GenericDataList[i],d.GenericDataList[j] = d.GenericDataList[j],d.GenericDataList[i]
}

//less方法用于定义数组中元素排序的“大小”的比较方式
func (d *dataSelector) Less(i ,j int) bool {
	a := d.GenericDataList[i].GetCreation()
	b := d.GenericDataList[j].GetCreation()
	return b.Before(a)
}

//重写上述3个方法使用sort.Sort进行排序
func (d *dataSelector)Sort() *dataSelector  {
	sort.Sort(d)
	return d
}

//  （3）过滤

//Filter方法用于过滤数据 比较数据的Name属性 若包含 则返回
func (d *dataSelector) Filter() *dataSelector {
	//判断入参是否为空 若为空 则返回所有数据
	if d.DataSelectQuery.FilterQuery.Name == "" {
		return d
	}
	//若不为空 则安照入参Name进行过滤
	//声明一个新的数组 若name包含 则把数据放进数组  返回出去
	filterd := []DataCell{}
	for _,value := range  d.GenericDataList{
		//定义是否匹配的标签变量 默认是匹配
		matches := true
		objName := value.GetName()
		if !strings.Contains(objName,d.DataSelectQuery.FilterQuery.Name){
			matches = false
			continue
		}
		if matches{
			filterd = append(filterd,value)
		}
	}
	d.GenericDataList = filterd
	return d
}

//分页
func (d *dataSelector) Paginate() *dataSelector {
	limit := d.DataSelectQuery.PaginateQuary.Limit
	page := d.DataSelectQuery.PaginateQuary.Page
	//验证参数合法 若不合法 则返回所有数据
	if limit <= 0 || page <= 0 {
		return d
	}
	//举例： 25个元素的数组，limit是10 ，page是3 startIndex是20 endIndex是30（实际上是25）
	startIndex := limit * (page - 1)
	endIndex := limit * page - 1

	//处理最后一页 这时候把endIndex由30变成25
	if len(d.GenericDataList) < endIndex {
		endIndex = len(d.GenericDataList)
	}

	d.GenericDataList = d.GenericDataList[startIndex:endIndex]
	return d

}


//定义podCell类型 实现GetCreation()和GetName() 方法后可以进行类型转换
type podCell corev1.Pod

func (p podCell) GetCreation() time.Time {
	return p.CreationTimestamp.Time
}

func (p podCell) GetName() string {
	return p.Name
}

type deploymentCell appsv1.Deployment
func (d deploymentCell) GetCreation() time.Time {
	return d.CreationTimestamp.Time
}
func (d deploymentCell) GetName() string {
	return d.Name
}

type daemonsetCell appsv1.DaemonSet
func (d daemonsetCell) GetCreation() time.Time {
	return d.CreationTimestamp.Time
}
func (d daemonsetCell) GetName() string {
	return d.Name
}

type statefulsetCell appsv1.StatefulSet
func (s statefulsetCell) GetCreation() time.Time {
	return s.CreationTimestamp.Time
}
func (s statefulsetCell) GetName() string {
	return s.Name
}

type serviceCell corev1.Service
func (s serviceCell) GetCreation() time.Time {
	return s.CreationTimestamp.Time
}
func (s serviceCell) GetName() string {
	return s.Name
}